{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multi-Turn Chat Benchmark\n",
    "\n",
    "```bash\n",
    "gcloud container clusters create-auto cluster-1 \\\n",
    "    --location=us-central1\n",
    "\n",
    "helm repo add kubeai https://www.kubeai.org\n",
    "helm repo update\n",
    "curl -L -O https://raw.githubusercontent.com/substratusai/kubeai/refs/heads/main/charts/kubeai/values-gke.yaml\n",
    "helm upgrade --install kubeai kubeai/kubeai \\\n",
    "    -f values-gke.yaml \\\n",
    "    --set secrets.huggingface.token=$HUGGING_FACE_HUB_TOKEN \\\n",
    "    --set metrics.prometheusOperator.vLLMPodMonitor.enabled=true \\\n",
    "    --set open-webui.enabled=false \\\n",
    "    --wait\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from subprocess import run, PIPE\n",
    "import json\n",
    "from kubernetes import client, config, dynamic\n",
    "from kubernetes.client import api_client\n",
    "from copy import deepcopy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "k8s_config = config.load_kube_config()\n",
    "\n",
    "k8s_client = dynamic.DynamicClient(\n",
    "    api_client.ApiClient(configuration=k8s_config)\n",
    ")\n",
    "models_client = k8s_client.resources.get(api_version=\"kubeai.org/v1\", kind=\"Model\")\n",
    "\n",
    "v1 = client.CoreV1Api()\n",
    "\n",
    "namespace = \"default\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "benchmark_pod_spec = {\n",
    "    \"apiVersion\": \"v1\",\n",
    "    \"kind\": \"Pod\",\n",
    "    \"metadata\": {\n",
    "        \"name\": \"bench\"\n",
    "    },\n",
    "    \"spec\": {\n",
    "        \"restartPolicy\": \"Never\",\n",
    "        \"containers\": [\n",
    "            {\n",
    "                \"name\": \"bench\",\n",
    "                \"image\": \"us-central1-docker.pkg.dev/substratus-dev/default/benchmark-multi-turn-chat-go:v0.1.1\",\n",
    "                \"imagePullPolicy\": \"Always\",\n",
    "                \"command\": [\"sleep\", \"infinity\"],\n",
    "                \"env\": [\n",
    "                    {\n",
    "                        \"name\": \"OPENAI_BASE_URL\",\n",
    "                        \"value\": \"http://kubeai/openai/v1\"\n",
    "                    }\n",
    "                ],\n",
    "                \"resources\": {\n",
    "                    \"requests\": {\n",
    "                        \"cpu\": \"2\",\n",
    "                        \"memory\": \"2G\"\n",
    "                    },\n",
    "                    \"limits\": {\n",
    "                        \"cpu\": \"2\",\n",
    "                        \"memory\": \"2G\"\n",
    "                    }\n",
    "                }\n",
    "            }\n",
    "        ]\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "base_model = {\n",
    "    \"apiVersion\": \"kubeai.org/v1\",\n",
    "    \"kind\": \"Model\",\n",
    "    \"metadata\": {\n",
    "        \"name\": \"bench\",\n",
    "        \"namespace\": \"default\",\n",
    "    },\n",
    "    \"spec\": {\n",
    "        \"features\": [\"TextGeneration\"],\n",
    "        \"url\": \"hf://neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8\",\n",
    "        \"engine\": \"VLLM\",\n",
    "        \"args\": [\n",
    "            \"--enable-prefix-caching\",\n",
    "            \"--max-model-len=16384\",\n",
    "            \"--max-num-batched-token=16384\",\n",
    "            \"--gpu-memory-utilization=0.90\",\n",
    "            \"--disable-log-requests\",\n",
    "        ],\n",
    "        \"resourceProfile\": \"nvidia-gpu-l4:1\"\n",
    "    },\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_k8s_service(model_name: str):\n",
    "    service_body = {\n",
    "        \"apiVersion\": \"v1\",\n",
    "        \"kind\": \"Service\",\n",
    "        \"metadata\": {\n",
    "            \"name\": f\"k8s-{model_name}\",\n",
    "            \"labels\": {\n",
    "                \"app\": f\"k8s-{model_name}\"\n",
    "            }\n",
    "        },\n",
    "        \"spec\": {\n",
    "            \"selector\": {\n",
    "                \"app.kubernetes.io/name\": \"vllm\",\n",
    "                \"model\": model_name\n",
    "            },\n",
    "            \"ports\": [\n",
    "                {\n",
    "                    \"name\": \"http\",\n",
    "                    \"protocol\": \"TCP\",\n",
    "                    \"port\": 80,\n",
    "                    \"targetPort\": 8000\n",
    "                }\n",
    "            ],\n",
    "            \"type\": \"ClusterIP\"\n",
    "        }\n",
    "    }\n",
    "\n",
    "    return v1.create_namespaced_service(namespace=namespace, body=service_body)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "benches = [\n",
    "    {\n",
    "        \"thread_count\": 8000,\n",
    "        \"max_concurrent_threads\": 300,\n",
    "    },\n",
    "    {\n",
    "        \"thread_count\": 8000,\n",
    "        \"max_concurrent_threads\": 600,\n",
    "    },\n",
    "    {\n",
    "        \"thread_count\": 8000,\n",
    "        \"max_concurrent_threads\": 1200,\n",
    "    },\n",
    "    {\n",
    "        \"thread_count\": 8000,\n",
    "        \"max_concurrent_threads\": 2400,\n",
    "    },\n",
    "]\n",
    "specs = [\n",
    "    {\n",
    "        \"minReplicas\": 8,\n",
    "        \"maxReplicas\": 8,\n",
    "        \"loadBalancing\": {\n",
    "            \"strategy\": \"PrefixHash\",\n",
    "            \"prefixHash\": {\n",
    "                \"meanLoadFactor\": 125,\n",
    "                \"prefixCharLength\": 100,\n",
    "                \"replication\": 256,\n",
    "            },\n",
    "        },\n",
    "    },\n",
    "    {\n",
    "        \"minReplicas\": 8,\n",
    "        \"maxReplicas\": 8,\n",
    "        \"loadBalancing\": {\n",
    "            \"strategy\": \"LeastLoad\",\n",
    "            \"prefixHash\": {\n",
    "                \"meanLoadFactor\": 125,\n",
    "                \"prefixCharLength\": 100,\n",
    "                \"replication\": 256,\n",
    "            },\n",
    "        },\n",
    "    },\n",
    "    {# k8s-native\n",
    "        \"minReplicas\": 8,\n",
    "        \"maxReplicas\": 8,\n",
    "    }\n",
    "] \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "bench={'thread_count': 8000, 'max_concurrent_threads': 300}, spec={'minReplicas': 8, 'maxReplicas': 8, 'loadBalancing': {'strategy': 'PrefixHash', 'prefixHash': {'meanLoadFactor': 125, 'prefixCharLength': 100, 'replication': 256}}}\n",
      "pod \"kubeai-74c9f949c4-p4w6q\" deleted\n",
      "pod \"open-webui-0\" deleted\n",
      "pod/kubeai-74c9f949c4-bg9fh condition met\n",
      "pod/open-webui-0 condition met\n",
      "pod/bench condition met\n",
      "model.kubeai.org/bench condition met\n",
      "kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count=8000 --max-concurrent-threads=300 --request-model=bench --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025/02/25 06:49:04 Shuffling dataset threads\n",
      "2025/02/25 06:49:04 Trimming dataset threads (9204) to specified thread count (8000)\n",
      "2025/02/25 06:49:04 Starting run...\n",
      "2025/02/25 06:59:08 Run completed, starting summarization...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_thread_count': 8000, 'input_messages_per_thread': {'mean': 7.378875}, 'duration': '10m4.223126978s', 'request_count': 59031, 'request_duration': {'mean': '2.937449585s'}, 'chunks_per_request': {'mean': 38.87284647049855}, 'failed_threads': 0, 'run_output_throughput': 3797.7741955639362, 'run_total_throughput': 41521.1349580028, 'ttft': {'mean': '128.475449ms'}, 'itl': {'mean': '72.25189ms'}, 'prompt_tokens': 22793327, 'cached_prompt_tokens': 0, 'completion_tokens': 2294703, 'total_tokens': 25088030}\n",
      "pod \"bench\" deleted\n",
      "bench={'thread_count': 8000, 'max_concurrent_threads': 600}, spec={'minReplicas': 8, 'maxReplicas': 8, 'loadBalancing': {'strategy': 'PrefixHash', 'prefixHash': {'meanLoadFactor': 125, 'prefixCharLength': 100, 'replication': 256}}}\n",
      "pod \"kubeai-74c9f949c4-bg9fh\" deleted\n",
      "pod \"open-webui-0\" deleted\n",
      "pod/kubeai-74c9f949c4-rzh5j condition met\n",
      "pod/open-webui-0 condition met\n",
      "pod/bench condition met\n",
      "model.kubeai.org/bench condition met\n",
      "kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count=8000 --max-concurrent-threads=600 --request-model=bench --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025/02/25 07:02:00 Shuffling dataset threads\n",
      "2025/02/25 07:02:00 Trimming dataset threads (9204) to specified thread count (8000)\n",
      "2025/02/25 07:02:00 Starting run...\n",
      "2025/02/25 07:09:21 Run completed, starting summarization...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_thread_count': 8000, 'input_messages_per_thread': {'mean': 7.378875}, 'duration': '7m20.304926648s', 'request_count': 59031, 'request_duration': {'mean': '4.117835214s'}, 'chunks_per_request': {'mean': 38.82454981281022}, 'failed_threads': 0, 'run_output_throughput': 5205.147299730788, 'run_total_throughput': 56932.5630554215, 'ttft': {'mean': '205.630098ms'}, 'itl': {'mean': '100.67815ms'}, 'prompt_tokens': 22775836, 'cached_prompt_tokens': 0, 'completion_tokens': 2291852, 'total_tokens': 25067688}\n",
      "pod \"bench\" deleted\n",
      "bench={'thread_count': 8000, 'max_concurrent_threads': 1200}, spec={'minReplicas': 8, 'maxReplicas': 8, 'loadBalancing': {'strategy': 'PrefixHash', 'prefixHash': {'meanLoadFactor': 125, 'prefixCharLength': 100, 'replication': 256}}}\n",
      "pod \"kubeai-74c9f949c4-rzh5j\" deleted\n",
      "pod \"open-webui-0\" deleted\n",
      "pod/kubeai-74c9f949c4-g44nb condition met\n",
      "pod/open-webui-0 condition met\n",
      "pod/bench condition met\n",
      "model.kubeai.org/bench condition met\n",
      "kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count=8000 --max-concurrent-threads=1200 --request-model=bench --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025/02/25 07:12:16 Shuffling dataset threads\n",
      "2025/02/25 07:12:16 Trimming dataset threads (9204) to specified thread count (8000)\n",
      "2025/02/25 07:12:16 Starting run...\n",
      "2025/02/25 07:18:05 Run completed, starting summarization...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_thread_count': 8000, 'input_messages_per_thread': {'mean': 7.378875}, 'duration': '5m49.192117322s', 'request_count': 59031, 'request_duration': {'mean': '6.277021263s'}, 'chunks_per_request': {'mean': 38.85490674391421}, 'failed_threads': 0, 'run_output_throughput': 6568.430059619489, 'run_total_throughput': 71811.59240452346, 'ttft': {'mean': '386.049694ms'}, 'itl': {'mean': '151.420324ms'}, 'prompt_tokens': 22782398, 'cached_prompt_tokens': 0, 'completion_tokens': 2293644, 'total_tokens': 25076042}\n",
      "pod \"bench\" deleted\n",
      "bench={'thread_count': 8000, 'max_concurrent_threads': 2400}, spec={'minReplicas': 8, 'maxReplicas': 8, 'loadBalancing': {'strategy': 'PrefixHash', 'prefixHash': {'meanLoadFactor': 125, 'prefixCharLength': 100, 'replication': 256}}}\n",
      "pod \"kubeai-74c9f949c4-g44nb\" deleted\n",
      "pod \"open-webui-0\" deleted\n",
      "pod/kubeai-74c9f949c4-lmwxv condition met\n",
      "pod/open-webui-0 condition met\n",
      "pod/bench condition met\n",
      "model.kubeai.org/bench condition met\n",
      "kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count=8000 --max-concurrent-threads=2400 --request-model=bench --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025/02/25 07:20:53 Shuffling dataset threads\n",
      "2025/02/25 07:20:53 Trimming dataset threads (9204) to specified thread count (8000)\n",
      "2025/02/25 07:20:53 Starting run...\n",
      "2025/02/25 07:30:50 Run completed, starting summarization...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_thread_count': 8000, 'input_messages_per_thread': {'mean': 7.378875}, 'duration': '9m56.670071664s', 'request_count': 59031, 'request_duration': {'mean': '20.759292618s'}, 'chunks_per_request': {'mean': 38.83127509274788}, 'failed_threads': 0, 'run_output_throughput': 3843.13896221578, 'run_total_throughput': 42032.4819209684, 'ttft': {'mean': '12.581182145s'}, 'itl': {'mean': '209.408459ms'}, 'prompt_tokens': 22786438, 'cached_prompt_tokens': 0, 'completion_tokens': 2293086, 'total_tokens': 25079524}\n",
      "pod \"bench\" deleted\n",
      "bench={'thread_count': 8000, 'max_concurrent_threads': 300}, spec={'minReplicas': 8, 'maxReplicas': 8, 'loadBalancing': {'strategy': 'LeastLoad', 'prefixHash': {'meanLoadFactor': 125, 'prefixCharLength': 100, 'replication': 256}}}\n",
      "pod \"kubeai-74c9f949c4-lmwxv\" deleted\n",
      "pod \"open-webui-0\" deleted\n",
      "pod/kubeai-74c9f949c4-z5xb6 condition met\n",
      "pod/open-webui-0 condition met\n",
      "pod/bench condition met\n",
      "model.kubeai.org/bench condition met\n",
      "kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count=8000 --max-concurrent-threads=300 --request-model=bench --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025/02/25 07:33:36 Shuffling dataset threads\n",
      "2025/02/25 07:33:36 Trimming dataset threads (9204) to specified thread count (8000)\n",
      "2025/02/25 07:33:36 Starting run...\n",
      "2025/02/25 07:44:36 Run completed, starting summarization...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_thread_count': 8000, 'input_messages_per_thread': {'mean': 7.378875}, 'duration': '10m59.819368534s', 'request_count': 59031, 'request_duration': {'mean': '3.198727361s'}, 'chunks_per_request': {'mean': 38.855702935745626}, 'failed_threads': 0, 'run_output_throughput': 3476.240785559492, 'run_total_throughput': 38004.916490577125, 'ttft': {'mean': '211.513933ms'}, 'itl': {'mean': '76.923279ms'}, 'prompt_tokens': 22782689, 'cached_prompt_tokens': 0, 'completion_tokens': 2293691, 'total_tokens': 25076380}\n",
      "pod \"bench\" deleted\n",
      "bench={'thread_count': 8000, 'max_concurrent_threads': 600}, spec={'minReplicas': 8, 'maxReplicas': 8, 'loadBalancing': {'strategy': 'LeastLoad', 'prefixHash': {'meanLoadFactor': 125, 'prefixCharLength': 100, 'replication': 256}}}\n",
      "pod \"kubeai-74c9f949c4-z5xb6\" deleted\n",
      "pod \"open-webui-0\" deleted\n",
      "pod/kubeai-74c9f949c4-gk2c8 condition met\n",
      "pod/open-webui-0 condition met\n",
      "pod/bench condition met\n",
      "model.kubeai.org/bench condition met\n",
      "kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count=8000 --max-concurrent-threads=600 --request-model=bench --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025/02/25 07:47:31 Shuffling dataset threads\n",
      "2025/02/25 07:47:31 Trimming dataset threads (9204) to specified thread count (8000)\n",
      "2025/02/25 07:47:31 Starting run...\n",
      "2025/02/25 07:55:29 Run completed, starting summarization...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_thread_count': 8000, 'input_messages_per_thread': {'mean': 7.378875}, 'duration': '7m58.500736269s', 'request_count': 59031, 'request_duration': {'mean': '4.492309617s'}, 'chunks_per_request': {'mean': 38.81702834104115}, 'failed_threads': 0, 'run_output_throughput': 4788.724084035334, 'run_total_throughput': 52380.64040492846, 'ttft': {'mean': '319.854104ms'}, 'itl': {'mean': '107.296883ms'}, 'prompt_tokens': 22772767, 'cached_prompt_tokens': 0, 'completion_tokens': 2291408, 'total_tokens': 25064175}\n",
      "pod \"bench\" deleted\n",
      "bench={'thread_count': 8000, 'max_concurrent_threads': 1200}, spec={'minReplicas': 8, 'maxReplicas': 8, 'loadBalancing': {'strategy': 'LeastLoad', 'prefixHash': {'meanLoadFactor': 125, 'prefixCharLength': 100, 'replication': 256}}}\n",
      "pod \"kubeai-74c9f949c4-gk2c8\" deleted\n",
      "pod \"open-webui-0\" deleted\n",
      "pod/kubeai-74c9f949c4-2d2wc condition met\n",
      "pod/open-webui-0 condition met\n",
      "pod/bench condition met\n",
      "model.kubeai.org/bench condition met\n",
      "kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count=8000 --max-concurrent-threads=1200 --request-model=bench --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025/02/25 07:58:10 Shuffling dataset threads\n",
      "2025/02/25 07:58:10 Trimming dataset threads (9204) to specified thread count (8000)\n",
      "2025/02/25 07:58:10 Starting run...\n",
      "2025/02/25 08:05:13 Run completed, starting summarization...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_thread_count': 8000, 'input_messages_per_thread': {'mean': 7.378875}, 'duration': '7m3.248768503s', 'request_count': 59031, 'request_duration': {'mean': '7.700969458s'}, 'chunks_per_request': {'mean': 38.861784486117465}, 'failed_threads': 0, 'run_output_throughput': 5420.098463874773, 'run_total_throughput': 59273.60660429701, 'ttft': {'mean': '1.196032821s'}, 'itl': {'mean': '166.676473ms'}, 'prompt_tokens': 22793431, 'cached_prompt_tokens': 0, 'completion_tokens': 2294050, 'total_tokens': 25087481}\n",
      "pod \"bench\" deleted\n",
      "bench={'thread_count': 8000, 'max_concurrent_threads': 2400}, spec={'minReplicas': 8, 'maxReplicas': 8, 'loadBalancing': {'strategy': 'LeastLoad', 'prefixHash': {'meanLoadFactor': 125, 'prefixCharLength': 100, 'replication': 256}}}\n",
      "pod \"kubeai-74c9f949c4-2d2wc\" deleted\n",
      "pod \"open-webui-0\" deleted\n",
      "pod/kubeai-74c9f949c4-grnsp condition met\n",
      "pod/open-webui-0 condition met\n",
      "pod/bench condition met\n",
      "model.kubeai.org/bench condition met\n",
      "kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count=8000 --max-concurrent-threads=2400 --request-model=bench --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025/02/25 08:08:02 Shuffling dataset threads\n",
      "2025/02/25 08:08:02 Trimming dataset threads (9204) to specified thread count (8000)\n",
      "2025/02/25 08:08:02 Starting run...\n",
      "2025/02/25 08:18:31 Run completed, starting summarization...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_thread_count': 8000, 'input_messages_per_thread': {'mean': 7.378875}, 'duration': '10m28.610653736s', 'request_count': 59031, 'request_duration': {'mean': '22.568652072s'}, 'chunks_per_request': {'mean': 38.78323253883553}, 'failed_threads': 0, 'run_output_throughput': 3643.757843407395, 'run_total_throughput': 39866.51013796651, 'ttft': {'mean': '12.912108233s'}, 'itl': {'mean': '245.956753ms'}, 'prompt_tokens': 22770008, 'cached_prompt_tokens': 0, 'completion_tokens': 2290505, 'total_tokens': 25060513}\n",
      "pod \"bench\" deleted\n",
      "bench={'thread_count': 8000, 'max_concurrent_threads': 300}, spec={'minReplicas': 8, 'maxReplicas': 8}\n",
      "pod \"kubeai-74c9f949c4-grnsp\" deleted\n",
      "pod \"open-webui-0\" deleted\n",
      "pod/kubeai-74c9f949c4-fw497 condition met\n",
      "pod/open-webui-0 condition met\n",
      "pod/bench condition met\n",
      "model.kubeai.org/bench condition met\n",
      "kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count=8000 --max-concurrent-threads=300 --request-model=bench --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025/02/25 08:22:42 Shuffling dataset threads\n",
      "2025/02/25 08:22:42 Trimming dataset threads (9204) to specified thread count (8000)\n",
      "2025/02/25 08:22:42 Starting run...\n",
      "2025/02/25 08:34:11 Run completed, starting summarization...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_thread_count': 8000, 'input_messages_per_thread': {'mean': 7.378875}, 'duration': '11m29.178892398s', 'request_count': 59031, 'request_duration': {'mean': '3.353627549s'}, 'chunks_per_request': {'mean': 38.85272145144077}, 'failed_threads': 0, 'run_output_throughput': 3327.8950143404822, 'run_total_throughput': 36395.055444493744, 'ttft': {'mean': '126.940244ms'}, 'itl': {'mean': '83.082534ms'}, 'prompt_tokens': 22789189, 'cached_prompt_tokens': 0, 'completion_tokens': 2293515, 'total_tokens': 25082704}\n",
      "pod \"bench\" deleted\n",
      "bench={'thread_count': 8000, 'max_concurrent_threads': 600}, spec={'minReplicas': 8, 'maxReplicas': 8}\n",
      "pod \"kubeai-74c9f949c4-fw497\" deleted\n",
      "pod \"open-webui-0\" deleted\n",
      "pod/kubeai-74c9f949c4-w24wf condition met\n",
      "pod/open-webui-0 condition met\n",
      "pod/bench condition met\n",
      "model.kubeai.org/bench condition met\n",
      "kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count=8000 --max-concurrent-threads=600 --request-model=bench --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025/02/25 08:36:59 Shuffling dataset threads\n",
      "2025/02/25 08:36:59 Trimming dataset threads (9204) to specified thread count (8000)\n",
      "2025/02/25 08:36:59 Starting run...\n",
      "2025/02/25 08:49:03 Run completed, starting summarization...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_thread_count': 8000, 'input_messages_per_thread': {'mean': 7.378875}, 'duration': '12m4.07344713s', 'request_count': 59031, 'request_duration': {'mean': '6.802742698s'}, 'chunks_per_request': {'mean': 38.871254086835734}, 'failed_threads': 0, 'run_output_throughput': 3169.184022830223, 'run_total_throughput': 34654.71368886544, 'ttft': {'mean': '2.264357412s'}, 'itl': {'mean': '115.110403ms'}, 'prompt_tokens': 22797836, 'cached_prompt_tokens': 0, 'completion_tokens': 2294722, 'total_tokens': 25092558}\n",
      "pod \"bench\" deleted\n",
      "bench={'thread_count': 8000, 'max_concurrent_threads': 1200}, spec={'minReplicas': 8, 'maxReplicas': 8}\n",
      "pod \"kubeai-74c9f949c4-w24wf\" deleted\n",
      "pod \"open-webui-0\" deleted\n",
      "pod/kubeai-74c9f949c4-6fr99 condition met\n",
      "pod/open-webui-0 condition met\n",
      "pod/bench condition met\n",
      "model.kubeai.org/bench condition met\n",
      "kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count=8000 --max-concurrent-threads=1200 --request-model=bench --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025/02/25 08:51:51 Shuffling dataset threads\n",
      "2025/02/25 08:51:51 Trimming dataset threads (9204) to specified thread count (8000)\n",
      "2025/02/25 08:51:51 Starting run...\n",
      "2025/02/25 09:05:04 Run completed, starting summarization...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_thread_count': 8000, 'input_messages_per_thread': {'mean': 7.378875}, 'duration': '13m13.186348355s', 'request_count': 59031, 'request_duration': {'mean': '13.934835229s'}, 'chunks_per_request': {'mean': 38.85734614016364}, 'failed_threads': 0, 'run_output_throughput': 2892.2169484607207, 'run_total_throughput': 31625.46865818341, 'ttft': {'mean': '8.481505257s'}, 'itl': {'mean': '140.334721ms'}, 'prompt_tokens': 22790823, 'cached_prompt_tokens': 0, 'completion_tokens': 2294067, 'total_tokens': 25084890}\n",
      "pod \"bench\" deleted\n",
      "bench={'thread_count': 8000, 'max_concurrent_threads': 2400}, spec={'minReplicas': 8, 'maxReplicas': 8}\n",
      "pod \"kubeai-74c9f949c4-6fr99\" deleted\n",
      "pod \"open-webui-0\" deleted\n",
      "pod/kubeai-74c9f949c4-nkz5f condition met\n",
      "pod/open-webui-0 condition met\n",
      "pod/bench condition met\n",
      "model.kubeai.org/bench condition met\n",
      "kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count=8000 --max-concurrent-threads=2400 --request-model=bench --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025/02/25 09:07:59 Shuffling dataset threads\n",
      "2025/02/25 09:07:59 Trimming dataset threads (9204) to specified thread count (8000)\n",
      "2025/02/25 09:07:59 Starting run...\n",
      "2025/02/25 09:16:38 Thread[6524/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[4927/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[3579/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[636/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[2089/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6525/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[5083/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[4970/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[278/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[1240/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[1041/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[1735/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[739/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6546/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[2254/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6548/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[3859/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[2155/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6541/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[290/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6547/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6544/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[2141/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[3818/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[683/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[4888/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[2369/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[890/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[339/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[4913/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[1773/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6549/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[5009/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6550/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[1988/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6542/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[4912/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[4997/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[2053/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[2162/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[5107/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[3886/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6552/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6551/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[631/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[1098/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6553/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[261/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6554/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[4897/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[1657/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[533/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6555/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[6561/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[508/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:38 Thread[2140/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5174/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6807/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5175/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[3965/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6803/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5179/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5379/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[4009/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[39/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[4006/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6804/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[3987/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6805/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6813/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5040/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5180/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[1284/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[647/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[4012/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6809/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[1117/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[2619/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5167/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6814/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6806/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[863/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[2553/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5191/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[1874/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[4058/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[1486/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5177/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[2150/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6818/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6820/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[344/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[1968/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5105/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6819/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6816/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5171/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[3294/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5192/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5389/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[4050/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[1005/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[2182/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[2024/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5267/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[749/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[1752/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[5166/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6817/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[3842/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[1302/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:57 Thread[6644/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:58 Thread[4321/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:58 Thread[5307/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:58 Thread[6748/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:16:59 Thread[6283/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:17:00 Thread[6834/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:17:00 Thread[6305/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:17:01 Thread[6431/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:17:01 Thread[6643/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:17:02 Thread[6766/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:17:02 Thread[6508/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:17:41 Thread[7203/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:17:42 Thread[7339/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:17:42 Thread[7377/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:17:42 Thread[7021/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:17:43 Thread[5967/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:18:02 Thread[4626/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:18:02 Thread[7591/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:18:02 Thread[7473/8000]: Failed: stream: context deadline exceeded (Client.Timeout or context cancellation while reading body)\n",
      "2025/02/25 09:22:54 Run completed, starting summarization...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'input_thread_count': 8000, 'input_messages_per_thread': {'mean': 7.378875}, 'duration': '14m54.733349231s', 'request_count': 58526, 'request_duration': {'mean': '27.65277817s'}, 'chunks_per_request': {'mean': 38.460256979803845}, 'failed_threads': 130, 'run_output_throughput': 2515.9998807854918, 'run_total_throughput': 27507.218794463235, 'ttft': {'mean': '21.44959869s'}, 'itl': {'mean': '158.817814ms'}, 'prompt_tokens': 22360477, 'cached_prompt_tokens': 0, 'completion_tokens': 2251149, 'total_tokens': 24611626}\n",
      "pod \"bench\" deleted\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[{'spec': {'minReplicas': 8,\n",
       "   'maxReplicas': 8,\n",
       "   'loadBalancing': {'strategy': 'PrefixHash',\n",
       "    'prefixHash': {'meanLoadFactor': 125,\n",
       "     'prefixCharLength': 100,\n",
       "     'replication': 256}}},\n",
       "  'bench': {'thread_count': 8000, 'max_concurrent_threads': 300},\n",
       "  'result': {'input_thread_count': 8000,\n",
       "   'input_messages_per_thread': {'mean': 7.378875},\n",
       "   'duration': '10m4.223126978s',\n",
       "   'request_count': 59031,\n",
       "   'request_duration': {'mean': '2.937449585s'},\n",
       "   'chunks_per_request': {'mean': 38.87284647049855},\n",
       "   'failed_threads': 0,\n",
       "   'run_output_throughput': 3797.7741955639362,\n",
       "   'run_total_throughput': 41521.1349580028,\n",
       "   'ttft': {'mean': '128.475449ms'},\n",
       "   'itl': {'mean': '72.25189ms'},\n",
       "   'prompt_tokens': 22793327,\n",
       "   'cached_prompt_tokens': 0,\n",
       "   'completion_tokens': 2294703,\n",
       "   'total_tokens': 25088030}},\n",
       " {'spec': {'minReplicas': 8,\n",
       "   'maxReplicas': 8,\n",
       "   'loadBalancing': {'strategy': 'PrefixHash',\n",
       "    'prefixHash': {'meanLoadFactor': 125,\n",
       "     'prefixCharLength': 100,\n",
       "     'replication': 256}}},\n",
       "  'bench': {'thread_count': 8000, 'max_concurrent_threads': 600},\n",
       "  'result': {'input_thread_count': 8000,\n",
       "   'input_messages_per_thread': {'mean': 7.378875},\n",
       "   'duration': '7m20.304926648s',\n",
       "   'request_count': 59031,\n",
       "   'request_duration': {'mean': '4.117835214s'},\n",
       "   'chunks_per_request': {'mean': 38.82454981281022},\n",
       "   'failed_threads': 0,\n",
       "   'run_output_throughput': 5205.147299730788,\n",
       "   'run_total_throughput': 56932.5630554215,\n",
       "   'ttft': {'mean': '205.630098ms'},\n",
       "   'itl': {'mean': '100.67815ms'},\n",
       "   'prompt_tokens': 22775836,\n",
       "   'cached_prompt_tokens': 0,\n",
       "   'completion_tokens': 2291852,\n",
       "   'total_tokens': 25067688}},\n",
       " {'spec': {'minReplicas': 8,\n",
       "   'maxReplicas': 8,\n",
       "   'loadBalancing': {'strategy': 'PrefixHash',\n",
       "    'prefixHash': {'meanLoadFactor': 125,\n",
       "     'prefixCharLength': 100,\n",
       "     'replication': 256}}},\n",
       "  'bench': {'thread_count': 8000, 'max_concurrent_threads': 1200},\n",
       "  'result': {'input_thread_count': 8000,\n",
       "   'input_messages_per_thread': {'mean': 7.378875},\n",
       "   'duration': '5m49.192117322s',\n",
       "   'request_count': 59031,\n",
       "   'request_duration': {'mean': '6.277021263s'},\n",
       "   'chunks_per_request': {'mean': 38.85490674391421},\n",
       "   'failed_threads': 0,\n",
       "   'run_output_throughput': 6568.430059619489,\n",
       "   'run_total_throughput': 71811.59240452346,\n",
       "   'ttft': {'mean': '386.049694ms'},\n",
       "   'itl': {'mean': '151.420324ms'},\n",
       "   'prompt_tokens': 22782398,\n",
       "   'cached_prompt_tokens': 0,\n",
       "   'completion_tokens': 2293644,\n",
       "   'total_tokens': 25076042}},\n",
       " {'spec': {'minReplicas': 8,\n",
       "   'maxReplicas': 8,\n",
       "   'loadBalancing': {'strategy': 'PrefixHash',\n",
       "    'prefixHash': {'meanLoadFactor': 125,\n",
       "     'prefixCharLength': 100,\n",
       "     'replication': 256}}},\n",
       "  'bench': {'thread_count': 8000, 'max_concurrent_threads': 2400},\n",
       "  'result': {'input_thread_count': 8000,\n",
       "   'input_messages_per_thread': {'mean': 7.378875},\n",
       "   'duration': '9m56.670071664s',\n",
       "   'request_count': 59031,\n",
       "   'request_duration': {'mean': '20.759292618s'},\n",
       "   'chunks_per_request': {'mean': 38.83127509274788},\n",
       "   'failed_threads': 0,\n",
       "   'run_output_throughput': 3843.13896221578,\n",
       "   'run_total_throughput': 42032.4819209684,\n",
       "   'ttft': {'mean': '12.581182145s'},\n",
       "   'itl': {'mean': '209.408459ms'},\n",
       "   'prompt_tokens': 22786438,\n",
       "   'cached_prompt_tokens': 0,\n",
       "   'completion_tokens': 2293086,\n",
       "   'total_tokens': 25079524}},\n",
       " {'spec': {'minReplicas': 8,\n",
       "   'maxReplicas': 8,\n",
       "   'loadBalancing': {'strategy': 'LeastLoad',\n",
       "    'prefixHash': {'meanLoadFactor': 125,\n",
       "     'prefixCharLength': 100,\n",
       "     'replication': 256}}},\n",
       "  'bench': {'thread_count': 8000, 'max_concurrent_threads': 300},\n",
       "  'result': {'input_thread_count': 8000,\n",
       "   'input_messages_per_thread': {'mean': 7.378875},\n",
       "   'duration': '10m59.819368534s',\n",
       "   'request_count': 59031,\n",
       "   'request_duration': {'mean': '3.198727361s'},\n",
       "   'chunks_per_request': {'mean': 38.855702935745626},\n",
       "   'failed_threads': 0,\n",
       "   'run_output_throughput': 3476.240785559492,\n",
       "   'run_total_throughput': 38004.916490577125,\n",
       "   'ttft': {'mean': '211.513933ms'},\n",
       "   'itl': {'mean': '76.923279ms'},\n",
       "   'prompt_tokens': 22782689,\n",
       "   'cached_prompt_tokens': 0,\n",
       "   'completion_tokens': 2293691,\n",
       "   'total_tokens': 25076380}},\n",
       " {'spec': {'minReplicas': 8,\n",
       "   'maxReplicas': 8,\n",
       "   'loadBalancing': {'strategy': 'LeastLoad',\n",
       "    'prefixHash': {'meanLoadFactor': 125,\n",
       "     'prefixCharLength': 100,\n",
       "     'replication': 256}}},\n",
       "  'bench': {'thread_count': 8000, 'max_concurrent_threads': 600},\n",
       "  'result': {'input_thread_count': 8000,\n",
       "   'input_messages_per_thread': {'mean': 7.378875},\n",
       "   'duration': '7m58.500736269s',\n",
       "   'request_count': 59031,\n",
       "   'request_duration': {'mean': '4.492309617s'},\n",
       "   'chunks_per_request': {'mean': 38.81702834104115},\n",
       "   'failed_threads': 0,\n",
       "   'run_output_throughput': 4788.724084035334,\n",
       "   'run_total_throughput': 52380.64040492846,\n",
       "   'ttft': {'mean': '319.854104ms'},\n",
       "   'itl': {'mean': '107.296883ms'},\n",
       "   'prompt_tokens': 22772767,\n",
       "   'cached_prompt_tokens': 0,\n",
       "   'completion_tokens': 2291408,\n",
       "   'total_tokens': 25064175}},\n",
       " {'spec': {'minReplicas': 8,\n",
       "   'maxReplicas': 8,\n",
       "   'loadBalancing': {'strategy': 'LeastLoad',\n",
       "    'prefixHash': {'meanLoadFactor': 125,\n",
       "     'prefixCharLength': 100,\n",
       "     'replication': 256}}},\n",
       "  'bench': {'thread_count': 8000, 'max_concurrent_threads': 1200},\n",
       "  'result': {'input_thread_count': 8000,\n",
       "   'input_messages_per_thread': {'mean': 7.378875},\n",
       "   'duration': '7m3.248768503s',\n",
       "   'request_count': 59031,\n",
       "   'request_duration': {'mean': '7.700969458s'},\n",
       "   'chunks_per_request': {'mean': 38.861784486117465},\n",
       "   'failed_threads': 0,\n",
       "   'run_output_throughput': 5420.098463874773,\n",
       "   'run_total_throughput': 59273.60660429701,\n",
       "   'ttft': {'mean': '1.196032821s'},\n",
       "   'itl': {'mean': '166.676473ms'},\n",
       "   'prompt_tokens': 22793431,\n",
       "   'cached_prompt_tokens': 0,\n",
       "   'completion_tokens': 2294050,\n",
       "   'total_tokens': 25087481}},\n",
       " {'spec': {'minReplicas': 8,\n",
       "   'maxReplicas': 8,\n",
       "   'loadBalancing': {'strategy': 'LeastLoad',\n",
       "    'prefixHash': {'meanLoadFactor': 125,\n",
       "     'prefixCharLength': 100,\n",
       "     'replication': 256}}},\n",
       "  'bench': {'thread_count': 8000, 'max_concurrent_threads': 2400},\n",
       "  'result': {'input_thread_count': 8000,\n",
       "   'input_messages_per_thread': {'mean': 7.378875},\n",
       "   'duration': '10m28.610653736s',\n",
       "   'request_count': 59031,\n",
       "   'request_duration': {'mean': '22.568652072s'},\n",
       "   'chunks_per_request': {'mean': 38.78323253883553},\n",
       "   'failed_threads': 0,\n",
       "   'run_output_throughput': 3643.757843407395,\n",
       "   'run_total_throughput': 39866.51013796651,\n",
       "   'ttft': {'mean': '12.912108233s'},\n",
       "   'itl': {'mean': '245.956753ms'},\n",
       "   'prompt_tokens': 22770008,\n",
       "   'cached_prompt_tokens': 0,\n",
       "   'completion_tokens': 2290505,\n",
       "   'total_tokens': 25060513}},\n",
       " {'spec': {'minReplicas': 8, 'maxReplicas': 8},\n",
       "  'bench': {'thread_count': 8000, 'max_concurrent_threads': 300},\n",
       "  'result': {'input_thread_count': 8000,\n",
       "   'input_messages_per_thread': {'mean': 7.378875},\n",
       "   'duration': '11m29.178892398s',\n",
       "   'request_count': 59031,\n",
       "   'request_duration': {'mean': '3.353627549s'},\n",
       "   'chunks_per_request': {'mean': 38.85272145144077},\n",
       "   'failed_threads': 0,\n",
       "   'run_output_throughput': 3327.8950143404822,\n",
       "   'run_total_throughput': 36395.055444493744,\n",
       "   'ttft': {'mean': '126.940244ms'},\n",
       "   'itl': {'mean': '83.082534ms'},\n",
       "   'prompt_tokens': 22789189,\n",
       "   'cached_prompt_tokens': 0,\n",
       "   'completion_tokens': 2293515,\n",
       "   'total_tokens': 25082704}},\n",
       " {'spec': {'minReplicas': 8, 'maxReplicas': 8},\n",
       "  'bench': {'thread_count': 8000, 'max_concurrent_threads': 600},\n",
       "  'result': {'input_thread_count': 8000,\n",
       "   'input_messages_per_thread': {'mean': 7.378875},\n",
       "   'duration': '12m4.07344713s',\n",
       "   'request_count': 59031,\n",
       "   'request_duration': {'mean': '6.802742698s'},\n",
       "   'chunks_per_request': {'mean': 38.871254086835734},\n",
       "   'failed_threads': 0,\n",
       "   'run_output_throughput': 3169.184022830223,\n",
       "   'run_total_throughput': 34654.71368886544,\n",
       "   'ttft': {'mean': '2.264357412s'},\n",
       "   'itl': {'mean': '115.110403ms'},\n",
       "   'prompt_tokens': 22797836,\n",
       "   'cached_prompt_tokens': 0,\n",
       "   'completion_tokens': 2294722,\n",
       "   'total_tokens': 25092558}},\n",
       " {'spec': {'minReplicas': 8, 'maxReplicas': 8},\n",
       "  'bench': {'thread_count': 8000, 'max_concurrent_threads': 1200},\n",
       "  'result': {'input_thread_count': 8000,\n",
       "   'input_messages_per_thread': {'mean': 7.378875},\n",
       "   'duration': '13m13.186348355s',\n",
       "   'request_count': 59031,\n",
       "   'request_duration': {'mean': '13.934835229s'},\n",
       "   'chunks_per_request': {'mean': 38.85734614016364},\n",
       "   'failed_threads': 0,\n",
       "   'run_output_throughput': 2892.2169484607207,\n",
       "   'run_total_throughput': 31625.46865818341,\n",
       "   'ttft': {'mean': '8.481505257s'},\n",
       "   'itl': {'mean': '140.334721ms'},\n",
       "   'prompt_tokens': 22790823,\n",
       "   'cached_prompt_tokens': 0,\n",
       "   'completion_tokens': 2294067,\n",
       "   'total_tokens': 25084890}},\n",
       " {'spec': {'minReplicas': 8, 'maxReplicas': 8},\n",
       "  'bench': {'thread_count': 8000, 'max_concurrent_threads': 2400},\n",
       "  'result': {'input_thread_count': 8000,\n",
       "   'input_messages_per_thread': {'mean': 7.378875},\n",
       "   'duration': '14m54.733349231s',\n",
       "   'request_count': 58526,\n",
       "   'request_duration': {'mean': '27.65277817s'},\n",
       "   'chunks_per_request': {'mean': 38.460256979803845},\n",
       "   'failed_threads': 130,\n",
       "   'run_output_throughput': 2515.9998807854918,\n",
       "   'run_total_throughput': 27507.218794463235,\n",
       "   'ttft': {'mean': '21.44959869s'},\n",
       "   'itl': {'mean': '158.817814ms'},\n",
       "   'prompt_tokens': 22360477,\n",
       "   'cached_prompt_tokens': 0,\n",
       "   'completion_tokens': 2251149,\n",
       "   'total_tokens': 24611626}}]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_results = []\n",
    "\n",
    "i = 0\n",
    "for spec in specs:\n",
    "    for bench in benches:\n",
    "        print(f\"{bench=}, {spec=}\")\n",
    "        try:\n",
    "            model = deepcopy(base_model)\n",
    "            model[\"spec\"].update(spec)\n",
    "            model_name = model.get(\"metadata\").get(\"name\")\n",
    "            model_replicas = model.get(\"spec\").get(\"minReplicas\")\n",
    "\n",
    "            !kubectl delete pod -l app.kubernetes.io/instance=kubeai\n",
    "            # Start a fresh instance of the benchmark Pod.\n",
    "            # !kubectl apply -f ./bench-pod.yaml\n",
    "            # This indicates using native K8s Service instead of KubeAI\n",
    "            if not \"loadBalancing\" in spec:\n",
    "                svc = create_k8s_service(model_name)\n",
    "                benchmark_pod_spec[\"spec\"][\"containers\"][0][\"env\"][0][\"value\"] = (\n",
    "                    f\"http://{svc.metadata.name}/v1\"\n",
    "                )\n",
    "            created_pod = v1.create_namespaced_pod(namespace=namespace, body=benchmark_pod_spec)\n",
    "\n",
    "            !kubectl wait pod --timeout 10m --for=condition=Ready -l app.kubernetes.io/instance=kubeai\n",
    "            !kubectl wait --timeout 10m --for=condition=Ready pod/{benchmark_pod_spec[\"metadata\"][\"name\"]}\n",
    "\n",
    "            #model[\"metadata\"][\"name\"] = model[\"metadata\"][\"name\"] + f'-{i}'\n",
    "            #models_client.create(body=model)\n",
    "            models_client.patch(\n",
    "                body=model,\n",
    "                content_type=\"application/apply-patch+yaml\",\n",
    "                field_manager=\"benchmark\",\n",
    "            )\n",
    "\n",
    "\n",
    "\n",
    "            !kubectl wait --timeout 30m --for=jsonpath='.status.replicas.ready'={model_replicas} model/{model_name}\n",
    "\n",
    "            thread_count = bench.get(\"thread_count\")\n",
    "            max_concurrent_threads = bench.get(\"max_concurrent_threads\")\n",
    "            cmd = f'kubectl exec bench -- bench --threads=./data/large-exact.json --thread-count={thread_count} --max-concurrent-threads={max_concurrent_threads} --request-model={model_name} --max-completion-tokens=40 --request-timeout=2m --seed=2 --format=json'\n",
    "            print(cmd)\n",
    "\n",
    "            output = run(cmd, shell=True, stdout=PIPE, encoding='utf8')\n",
    "            result = json.loads(output.stdout)\n",
    "            print(result)\n",
    "            all_results.append({\n",
    "                \"spec\": spec,\n",
    "                \"bench\": bench,\n",
    "                \"result\": result\n",
    "            }) \n",
    "        finally:\n",
    "            if not \"loadBalancing\" in spec:\n",
    "                v1.delete_namespaced_service(namespace=namespace, name=f\"k8s-{model_name}\")\n",
    "            models_client.delete(name=model_name, namespace=\"default\")\n",
    "            !kubectl delete --now pod/{benchmark_pod_spec[\"metadata\"][\"name\"]}\n",
    "            i+=1\n",
    "\n",
    "all_results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Conccurency: 300 \"Strategy PrefixHash: TTFT=128.475449ms ITL=72.25189ms TPS(total)=41521.1349580028\n",
      "Conccurency: 600 \"Strategy PrefixHash: TTFT=205.630098ms ITL=100.67815ms TPS(total)=56932.5630554215\n",
      "Conccurency: 1200 \"Strategy PrefixHash: TTFT=386.049694ms ITL=151.420324ms TPS(total)=71811.59240452346\n",
      "Conccurency: 2400 \"Strategy PrefixHash: TTFT=12.581182145s ITL=209.408459ms TPS(total)=42032.4819209684\n",
      "Conccurency: 300 \"Strategy LeastLoad: TTFT=211.513933ms ITL=76.923279ms TPS(total)=38004.916490577125\n",
      "Conccurency: 600 \"Strategy LeastLoad: TTFT=319.854104ms ITL=107.296883ms TPS(total)=52380.64040492846\n",
      "Conccurency: 1200 \"Strategy LeastLoad: TTFT=1.196032821s ITL=166.676473ms TPS(total)=59273.60660429701\n",
      "Conccurency: 2400 \"Strategy LeastLoad: TTFT=12.912108233s ITL=245.956753ms TPS(total)=39866.51013796651\n",
      "Conccurency: 300 \"Strategy k8s-native: TTFT=126.940244ms ITL=83.082534ms TPS(total)=36395.055444493744\n",
      "Conccurency: 600 \"Strategy k8s-native: TTFT=2.264357412s ITL=115.110403ms TPS(total)=34654.71368886544\n",
      "Conccurency: 1200 \"Strategy k8s-native: TTFT=8.481505257s ITL=140.334721ms TPS(total)=31625.46865818341\n",
      "Conccurency: 2400 \"Strategy k8s-native: TTFT=21.44959869s ITL=158.817814ms TPS(total)=27507.218794463235\n"
     ]
    }
   ],
   "source": [
    "for r in all_results:\n",
    "    print(f'Conccurency: {r[\"bench\"][\"max_concurrent_threads\"]} \"Strategy {r[\"spec\"].get(\"loadBalancing\", {}).get(\"strategy\", \"k8s-native\")}: TTFT={r[\"result\"][\"ttft\"][\"mean\"]} ITL={r[\"result\"][\"itl\"][\"mean\"]} TPS(total)={r[\"result\"][\"run_total_throughput\"]}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(\"8-replicas.json\", \"w\") as file:\n",
    "    json.dump(all_results, file, indent=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.0"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "def parse_time(time_str):\n",
    "    if time_str.endswith(\"ms\"):\n",
    "        return float(time_str[:-2]) / 1000.0\n",
    "    elif time_str.endswith(\"s\"):\n",
    "        return float(time_str[:-1])\n",
    "    else:\n",
    "        return float(time_str)\n",
    "\n",
    "parse_time(\"2s\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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7i369ddf1aZNG+XMmVOurq6qUqWKxesr/Xudbd68Wb169VLu3LlVoEAB8/rKlSsrZ86cWr58eZraDWQW9AQB6SgoKEghISGaP3++GjduLOmfP2CRkZFq166dPv300xTb9OjRQ7Nnz1a3bt3Ur18/nTt3Tp999pkOHDig7du3y8nJSdI/f4g8PDw0YMAAeXh46Oeff9aIESMUFRWlDz74wGKf169fV6NGjdS6dWu1bdtWixcv1pAhQ1SuXDlzXI/bf3vBnJyc5O3tnW7737x5sxYuXKh+/frJxcVFn3/+uRo1aqTdu3erbNmyqlu3rgICAjR37ly1atXKYtu5c+eqSJEiCgkJeaQY/vrrL1WvXl0xMTHq16+fcuXKpTlz5ui5557T4sWLzceNiorS9OnT1b59e3Xv3l03b97UjBkzFBoaqt27d6tixYqS/vlg2qJFC23btk09e/ZUqVKltHTpUoWFhVkV182bN82v/7Vr1zRv3jwdPXpUM2bMsKg3depUlSlTRs8995yyZcumH374Qb169VJSUtJ9e4zS2p5k8+bN082bN9WjRw+ZTCZNmDBBrVu31m+//WY+3w8fPqxatWrJyclJr776qoKCgnT27Fn98MMPevfdd+/b3jNnzqhNmzZ6+eWXFRYWppkzZ6pr166qXLmyypQpI0m6ePGi6tWrJ5PJpLfeekvZs2fX9OnTrf62v3bt2ipQoIDmzZund955R5K0cOFCeXh4qGnTpinqJyUl6bnnntO2bdv06quvqlSpUjpy5Ig+/vhjnTp1ynwP0DfffKNXXnlFVatW1auvvipJKlKkiMW+2rZtq0KFCmncuHHav3+/pk+frty5c2v8+PHmOq+88ormzJmjNm3a6M0339SuXbs0btw4nThxwuILgREjRmjs2LFq0qSJmjRpov3796thw4aKi4t74GsQHx+vPXv26LXXXntgXcMw9Nxzz2njxo16+eWXVbFiRa1du1aDBg3SxYsX9fHHH0v6p/dy+fLlioqKkpeXlwzD0Pbt2+Xg4KCtW7fqueeekyRt3bpVDg4O5vuQYmJiVKdOHV28eFE9evRQwYIF9csvv+itt97SpUuXNGnSJIt4Zs2apTt37ujVV1+Vi4uLcubM+cA2JBs1apTGjRtn/j1FRUVp79692r9/v5599tkHbt+nTx/5+Pho1KhROnnypKZOnarz58+b7+WT/jkPwsLCFBoaqvHjxysmJkZTp05VzZo1deDAAQUFBalHjx76888/Uwwj9vPz09SpU1MMV07u8T927Jhq1Kih/Pnza+jQocqePbu+++47tWzZUt9//32K98levXrJz89PI0aM0K1btyzWVapUyWJCDCBLMAA8slmzZhmSjD179hifffaZ4enpacTExBiGYRgvvPCCUa9ePcMwDCMwMNBo2rSpebutW7cakoy5c+da7G/NmjUpypP3d7cePXoY7u7uxp07d8xlderUMSQZX3/9tbksNjbWyJs3r/H888+nuU1///23IckYOXLkI9ULCwszJKX4qVOnTqr1e/fubVj71pS8z71795rLzp8/b7i6uhqtWrUyl7311luGi4uLcePGDXNZRESEkS1btge2c+PGjYYkY9GiRfes079/f0OSsXXrVnPZzZs3jUKFChlBQUFGYmKiYRiGkZCQYMTGxlpse/36dSNPnjzGSy+9ZC5btmyZIcmYMGGCuSwhIcGoVauWIcmYNWtWmmL+74+Dg4Px7rvvpqif2jkWGhpqFC5c2KKsTp06Fr+/tLbn3LlzhiQjV65cxrVr18zly5cvNyQZP/zwg7msdu3ahqenp3H+/HmL/SYlJZn/n3zdnTt3zlwWGBhoSDK2bNliLouIiDBcXFyMN99801zWt29fw2QyGQcOHDCXXb161ciZM2eKfaZm5MiRhiTj77//NgYOHGgULVrUvO6pp54yunXrZhjGP+dm7969zeu++eYbw8HBweIcMQzDmDZtmiHJ2L59u7kse/bsRlhY2D2PffdraxiG0apVKyNXrlzm5YMHDxqSjFdeecWi3sCBAw1Jxs8//2x+fZydnY2mTZtavL5vv/22ISnVGO525swZQ5IxefLkFOvCwsKMwMBA83LyOT127FiLem3atDFMJpNx5swZwzAMY8+ePYYkY9WqVYZhGMbhw4cNScYLL7xgVKtWzbzdc889ZwQHB5uXx4wZY2TPnt04deqUxf6HDh1qODo6GhcuXDAM499z0cvLy4iIiLhv+5IFBgZavBYVKlSweD9Pq+TztnLlykZcXJy5fMKECYYkY/ny5YZh/PPe4ePjY3Tv3t1i+8uXLxve3t4W5fd637zf+3P9+vWNcuXKWfz9SEpKMqpXr24UK1YsRbw1a9Y0EhISUm3Tq6++ari5uaXtBQAy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1lSlSpX06quvqlChQgoPD9ePP/5okbg8rMGDB+vbb7/Vs88+q759+5qnyC5YsKCuXbv2UL0wr7/++gPrdO7cWd9995169uypjRs3qkaNGkpMTNSvv/6q7777TmvXrlWVKlUk/fP8lfXr12vixIny9/dXoUKFUr3n7F4qVKigsLAwffnll+Yhtbt379acOXPUsmVLcy+En5+fBg4cqHHjxqlZs2Zq0qSJDhw4oNWrV6f5C4IWLVpo2LBh5imt76V58+aqV6+ehg0bpvDwcFWoUEE//fSTli9frv79+1tMA+7u7q7KlStr586d5mcESf/0BN26dUu3bt1KkQQNGjRIK1asULNmzczTot+6dUtHjhzR4sWLFR4enm5fepQuXVp169Y1Pydn7969Wrx4sfr06ZOm7ePi4lS/fn21bdtWJ0+e1Oeff66aNWuap//28vLS1KlT1blzZ1WqVEnt2rWTn5+fLly4oB9//FE1atQwJ5PJk8L069dPoaGhcnR0VLt27eTm5qbSpUtr4cKFKl68uHLmzKmyZcuqbNmymjJlimrWrKly5cqpe/fuKly4sP766y/t2LFDf/zxhw4dOpSmduzbt0/Xrl1TixYtHuJVBGzo8U9IBzx57p4i+37+O0V2si+//NKoXLmy4ebmZnh6ehrlypUzBg8ebPz555/mOtu3bzeefvppw83NzfD39zcGDx5srF271pBkbNy40VyvTp06RpkyZVIc479T1T5Iek6RnT179jQf92GnyO7du7fx7bffGsWKFTNcXFyM4OBgi9flbrGxsUaOHDkMb29v4/bt22k6xr2mm07+SZ7y+OzZs0abNm0MHx8fw9XV1ahataqxcuVKi30lJSUZ7733nhEYGGiOdeXKlan+jq5evWp07tzZ8PLyMry9vY3OnTsbBw4ceOgpsp2dnY2SJUsa7777rsX0vIZhGCtWrDDKly9vuLq6GkFBQcb48eONmTNnppgy+r9TZKe1PcnTEn/wwQcpYk3tHDp69KjRqlUr82tZokQJY/jw4eb195oiO7Vr7L8xG4ZhHDhwwKhVq5bh4uJiFChQwBg3bpzx6aefGpKMy5cv3/uFNSynyL6f5HPzbnFxccb48eONMmXKGC4uLkaOHDmMypUrG6NHjzYiIyPN9X799Vejdu3ahpubm8VU1fc6dmqvR3x8vDF69GijUKFChpOT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rIoVK0qSjh49arGOSRIAAAAAZHZWJ0EbN27MiDgAAAAA4LGw+p6gZGfOnNHatWt1+/ZtSZJhGOkWFAAAAABkFKuToKtXr6p+/foqXry4mjRpokuXLkmSXn75Zb355pvpHiAAAAAApCerk6A33nhDTk5OunDhgtzd3c3lL774otasWZOuwQEAAABAerP6nqCffvpJa9euVYECBSzKixUrpvPnz6dbYAAAAACQEazuCbp165ZFD1Cya9euycXFJV2CAgAAAICMYnUSVKtWLX399dfmZZPJpKSkJE2YMEH16tVL1+AAAAAAIL1ZPRxuwoQJql+/vvbu3au4uDgNHjxYx44d07Vr17R9+/aMiBEAAAAA0o3VPUFly5bVqVOnVLNmTbVo0UK3bt1S69atdeDAARUpUiQjYgQAAACAdPNQD0utV6+ehg0blmLdlClT1Lt373QJDAAAAAAygtU9Qa1bt9a+fftSlH/yySd666230iUoAAAAAMgoVidBH3zwgRo3bqxff/3VXPbRRx9pxIgR+vHHH9M1OAAAAABIb1YPh3vllVd07do1NWjQQNu2bdPChQv13nvvadWqVapRo0ZGxAgAAAAA6cbqJEiSBg8erKtXr6pKlSpKTEzU2rVr9fTTT6d3bAAAAACQ7tKUBH366acpyvLnzy93d3fVrl1bu3fv1u7duyVJ/fr1S98IAQAAACAdmQzDMB5UqVChQmnbmcmk33777ZGDSquoqCh5e3srMjJSXl5ej+24AADAfgQN5Z7nZOHvN7V1CMA9WZMbpKkn6Ny5c+kSGAAAAADYmtWzw93NMAyloSMJAAAAADKNh0qCvv76a5UrV05ubm5yc3NT+fLl9c0336R3bAAAAACQ7qyeHW7ixIkaPny4+vTpY54Se9u2berZs6euXLmiN954I92DBAAAAID0YnUSNHnyZE2dOlVdunQxlz333HMqU6aMRo0aRRIEAAAAIFOzejjcpUuXVL169RTl1atX16VLl9IlKAAAAADIKFYnQUWLFtV3332XonzhwoUqVqxYugQFAAAAABklzcPhnnnmGS1ZskSjR4/Wiy++qC1btpjvCdq+fbs2bNiQanIEAAAAAJlJmnuCNm3apLi4OD3//PPatWuXfH19tWzZMi1btky+vr7avXu3WrVqlZGxAgAAAMAjs3piBEmqXLmyvv322/SOBQAA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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def ttft_bar_plot(results):\n",
    "    data_by_strategy = {}\n",
    "    for res in results:\n",
    "        bench = res['bench']\n",
    "        max_threads = bench['max_concurrent_threads']\n",
    "        ttft_str = res['result']['ttft']['mean']\n",
    "        ttft_sec = parse_time(ttft_str)\n",
    "\n",
    "        # Get the load balancing strategy; use \"K8s - Service\" if not defined.\n",
    "        strategy = res.get('spec', {}).get('loadBalancing', {}).get('strategy', 'K8s Service')\n",
    "        if strategy != \"K8s Service\":\n",
    "            strategy = f\"KubeAI {strategy}\"\n",
    "\n",
    "        if strategy not in data_by_strategy:\n",
    "            data_by_strategy[strategy] = {\"max_threads\": [], \"ttft\": []}\n",
    "        data_by_strategy[strategy][\"max_threads\"].append(max_threads)\n",
    "        data_by_strategy[strategy][\"ttft\"].append(ttft_sec)\n",
    "\n",
    "    # Convert the grouped data into a mapping for easier lookup:\n",
    "    # strategy -> {max_concurrent_threads: ttft_sec}\n",
    "    data_mapping = {}\n",
    "    for strategy, data in data_by_strategy.items():\n",
    "        data_mapping[strategy] = dict(zip(data[\"max_threads\"], data[\"ttft\"]))\n",
    "\n",
    "    # Get the sorted unique max_concurrent_threads values across all groups.\n",
    "    unique_x = sorted(set(\n",
    "        max_thread \n",
    "        for data in data_by_strategy.values() \n",
    "        for max_thread in data[\"max_threads\"]\n",
    "    ))\n",
    "\n",
    "    # Setup for a grouped bar chart.\n",
    "    num_strategies = len(data_mapping)\n",
    "    bar_width = 0.8 / num_strategies  # total width per group = 0.8\n",
    "    x_indices = np.arange(len(unique_x))\n",
    "\n",
    "    plt.figure(figsize=(10, 6))\n",
    "    for i, (strategy, mapping) in enumerate(data_mapping.items()):\n",
    "        # Retrieve ttft values for each unique max_concurrent_threads (default to 0 if not present)\n",
    "        y_values = [mapping.get(x, 0) for x in unique_x]\n",
    "        # Shift each strategy's bars for a grouped effect.\n",
    "        bars = plt.bar(x_indices + i * bar_width, y_values, width=bar_width, label=strategy)\n",
    "        # Annotate each bar with its height (i.e. TTFT value)\n",
    "        for bar in bars:\n",
    "            height = bar.get_height()\n",
    "            plt.text(bar.get_x() + bar.get_width() / 2, height,\n",
    "                     f'{height:.2f}', ha='center', va='bottom', fontsize=9)\n",
    "\n",
    "    plt.xlabel(\"Max Concurrent Threads\")\n",
    "    plt.ylabel(\"Mean Time To First Token (s)\")\n",
    "    plt.title(\"Mean TTFT by Load Balancing Method (lower is better)\")\n",
    "    plt.xticks(x_indices + bar_width * (num_strategies - 1) / 2, unique_x)\n",
    "    plt.legend()\n",
    "    plt.grid(axis='y')\n",
    "    plt.savefig(\"ttft_8r.png\", dpi=300)\n",
    "    plt.show()\n",
    "\n",
    "# Seems a pod failure happened with 2400 concurrency so removing invalid results.\n",
    "filtered_data = list(filter(lambda item: item.get(\"bench\")['max_concurrent_threads'] != 2400, all_results))\n",
    "filtered_data.reverse()\n",
    "ttft_bar_plot(filtered_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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5s6di7e3N2FhYQQGBnL37l0AatWqxblz51i9ejXr1q2jWrVqdO7cmS+//NJox8HBwfh3wvkmZwITEREREUk5SsgkWXLlysXmzZuNpGzNmjW4ubnh7e3NkSNHrOoeOHDA6ss+wM6dO63e79ixg3z58mFvb0/JkiWJi4vj8uXLDx1+OGPGDCpVqsQ333xjtX3mzJnMmDHDpoTMzs4uUcLzKMmJL7l69eqFnZ0dISEh1K5dmzp16tg8DPTEiRNcvXqVkSNH4uvrC8CePXsS1fP29iYoKIigoCAqVqxInz59rBIyEREREUl9mtRDks3X15dNmzYZ07tHRkbyxhtvsGfPHubMmcOpU6cYPHhwogQN7g2l69mzJydPnuTHH39kwoQJdO/eHYD8+fPTvHlzWrVqxZIlSzh79iy7du1ixIgRrFq1ipiYGL777juaNm1K0aJFrV7t2rVj586dHD169Kmd9+PiS65Vq1bx7bffMnfuXN5880369OlDUFAQ169ftymenDlz4ujoyIQJEzhz5gw//fQTn376qVWdQYMGsXz5ck6fPs3Ro0dZuXJlomGQIiIiIpL61EOWyg4HHU7tEGySI0cONm3aRNWqVQkMDOTnn39m4MCBfPTRR9y5c4c2bdrQqlUrDh+2Pq9WrVpx+/ZtypYti729Pd27d6dDhw5G+cyZMxk+fDi9evXi77//xsvLi/Lly1O3bl1++uknrl69muTsjoUKFaJQoULMmDGDsWPHPrXzflR8yXHlyhXatm3LkCFDKFWqFHBvIo21a9fSsWNH5s+fn+xYvL29mTVrFgMGDODrr7+mVKlSfPnll9SrV8+o4+joSP/+/QkNDcXFxYWKFSsyb948205aRERERJ46k+XBB4DkiURGRuLh4UFERATu7u5WZXfu3OHs2bP4+fnh7OycShGKPBl9fkVERNI2/9n+qR1CmpFWOjselRs8SEMWRUREREREUokSMhERERERkVSihExERERERCSVKCETERERERFJJUrIniHNnyLPI31uRURERJ4eJWTPQMIiybdu3UrlSERsd/fuXQDs7e1TORIRERGRF4/WIXsG7O3t8fT05PLlywCkT58ek8mUylGJPF58fDxXrlwhffr0pEunXxciIiIiKU3fsJ4RHx8fACMpE3le2NnZkTNnTv0RQUREROQpUEL2jJhMJrJmzUrmzJmJiYlJ7XBEks3R0RE7O41uFhEREXkalJA9Y/b29noWR0REREREAE3qISIiIiIikmqUkImIiIiIiKQSJWQiIiIiIiKpRAmZiIiIiIhIKlFCJiIiIiIikkqUkImIiIiIiKQSJWQiIiIiIiKpRAmZiIiIiIhIKlFCJiIiIiIikkqUkImIiIiIiKQSJWQiIiIi8kIIDg7G0dERs9lsvLZv326U//HHH9SqVYsMGTKQPXt2Ro8ebZRdvnyZ5s2bkyNHDtzd3SlZsiQ//fSTUf7rr79atWs2m7Gzs6Nbt24AREdHU6VKFTJnzoy7uzsFCxZk6tSpj4w3Ojqa3r17kzVrVsxmM/7+/oSGhgJw4cIF6tWrR7Zs2TCZTBw4cCDlLpSkKUrIREREROSF0alTJ6KiooxXQEAAAHFxcdSrV49SpUpx+fJlfvnlFyZOnMgPP/wAQFRUFCVLlmTHjh2Eh4czbNgwmjZtyrFjxwCoWLGiVbt//PEH9vb2NGnSBIB06dIxYcIEzp8/T2RkJEuWLGHgwIH8+uuvD421devW/PHHH+zdu5cbN26wcOFCPD09AbCzs6NmzZosW7bs6V0sSROUkImIiIjIC+/kyZOcPHmSwYMH4+DgQIECBWjbtq3Ri/XKK6/Qu3dvcuTIgZ2dHW+99RYFChRgx44dSbY3e/Zs8uXLx2uvvQaAvb09/v7+pEuXDgCTyYTJZOL06dNJ7n/06FGWL1/Ot99+a/SCFSxY0EjIsmTJQqdOnShbtmwKXwlJa1I9Ifv7779p0aIFmTJlwsXFBX9/f/bs2WOUWywWBg0aRNasWXFxcaF69eqcOnXKqo1r167RvHlz3N3d8fT0pG3btkRFRVnVOXToEBUrVsTZ2RlfX1+rLuoECxcupGDBgjg7O+Pv78/q1aufzkmLiIiIyFMxZ84cMmbMSJEiRRgzZgzx8fEAxn8tFotRNz4+nkOHDiXZzuXLlzl+/DjFihVLsvzbb7+lbdu2ibbXrVsXZ2dnChcuTJYsWWjYsGGS+2/evJncuXPzySef4O3tTb58+ZL8fiovvlRNyK5fv06FChVwcHAgJCSEY8eOMWbMGDJkyGDUGT16NF9//TVTpkxh586duLq6EhgYyJ07d4w6zZs35+jRo6xbt46VK1eyZcsWOnToYJRHRkZSo0YNcuXKxd69e/niiy8YMmSI1bjebdu20bRpU9q2bcv+/ftp0KABDRo04MiRI8/mYoiIiIjIf9KtWzdOnjzJlStXmDFjBuPHj2f8+PEAFChQgNy5czNo0CCio6M5evQo3377LZGRkYnauXv3Lk2aNOHdd9+lTJkyicp//fVXzpw5Q6tWrRKVrVy5kps3b7Jp0yYaNWqEi4tLkrFeu3aNY8eOYTab+fPPP1m2bBnjx4/nu++++49XQZ43Jsv9fyZ4xvr168fWrVsfOrbWYrGQLVs2evXqRe/evQGIiIggS5YszJo1iyZNmnD8+HEKFy7M7t27jRtmzZo11K5dm7/++ots2bIxefJkPv74Yy5evIijo6Nx7GXLlnHixAkA3nvvPW7evMnKlSuN45cvX54SJUowZcqUx55LZGQkHh4eRERE4O7u/p+ui4iIiIj8d5MmTWLOnDnGsMOjR4/y4Ycfsm/fPnLkyEG9evX43//+x6VLl4x97t69S+PGjYmPj2fJkiXGd8f7BQcHExUVxaJFix55/M6dO5M1a1Y++eSTRGXjxo2jd+/e3Lx5EycnJwAGDhzIyZMnWbBggVVdk8nE/v37KVGiRJLH8Z/t/8g4XiaHgw6ndgiAbblBumcUU5J++uknAgMDeeedd9i8eTPZs2enU6dOtG/fHoCzZ89y8eJFqlevbuzj4eFBuXLl2L59O02aNGH79u14enpa/fWievXq2NnZsXPnTho2bMj27dupVKmS1Q0VGBjIqFGjuH79OhkyZGD79u307NnTKr7AwMCHPkgZHR1NdHS08T7hrysxMTHExMT852sjIiIiIv+NxWLBYrEY383y58/PqlWrjPL+/ftTsWJFozyhZ+zu3bssXrwYk8mU6HtdZGQkCxcuZP78+Y/9zhcdHc3JkyeTrFekSBEAYmNjsbO7N2gtLi6O+Pj4JOs/6jumE06PjONlkla+h9sSR6omZGfOnGHy5Mn07NmTAQMGsHv3brp164ajoyNBQUFcvHgRuPdQ4/2yZMlilF28eJHMmTNbladLl46MGTNa1fHz80vURkJZhgwZuHjx4iOP86ARI0YwdOjQRNvXrl1L+vTpk3sJRERERCSF/Pbbb5QqVQoXFxf++OMPRo0aRe3atY15AUJDQ/Hx8cHe3p49e/Ywbdo0hg0bxurVq4mNjWX06NHcuXOHTz75hA0bNiR5jJ9//pn06dMTExNjNd/AmTNniIyMpFChQqRLl479+/fz/fff06lTpyTnJYiLiyNr1qwEBwfTpEkTLl26xNSpU2nVqpVR/+7du0b9TZs2ERoaSrp06YwELsFAz4H/+dq9KNLKHBC3bt1Kdt1UTcji4+MpU6YMn3/+OQAlS5bkyJEjTJkyhaCgoNQM7bH69+9v1aMWGRmJr68vNWrU0JBFERERkVTw5ZdfMm3aNGJjY8mWLRsffvghPXv2NBKYQYMGMWzYMO7cuUOxYsX46aefjFkSt2zZwq5du3B2dqZ169ZGm3379qVfv37G++HDh/P+++9Tt25dq2Pv3buXLl26MGbMGEwmE7ly5WLs2LHGyC+ADBkysGLFCl5//XUAChYsSOfOnWnVqhWZM2emT58+Vt8v7x/d9dFHHwGwbt06KleubHXsgB8C/tN1e5Fsb7b98ZWegaSeTXyYVE3IsmbNSuHCha22FSpUiMWLFwPg4+MDwKVLl8iaNatR59KlS8YYWh8fHy5fvmzVRmxsLNeuXTP29/HxsRobnNDG/cd4WJ2E8gc5OTkZ433v5+DggIODw8NPWkRERESeiket+QX3RjiNGDEiybJq1aqRnKkVdu/eneT28uXLW80UnpQHZwEvXLgwGzdufGj95E71EE304yu9JNLK93Bb4kjVWRYrVKjAyZMnrbb9/vvv5MqVCwA/Pz98fHysuowjIyPZuXOnschfQEAA4eHh7N2716jzyy+/EB8fT7ly5Yw6W7ZssRrLuW7dOgoUKGDM6BgQEJCoa3rdunXGcURERERERFJaqiZkH374ITt27ODzzz/n9OnT/PDDD0ydOpXOnTsD92aU6dGjB8OHD+enn37i8OHDtGrVimzZstGgQQPgXo9azZo1ad++Pbt27WLr1q106dKFJk2akC1bNgCaNWuGo6Mjbdu25ejRo8yfP5/x48dbdQl3796dNWvWMGbMGE6cOMGQIUPYs2cPXbp0eebXRUREREREXg6pOu093FuroX///pw6dQo/Pz969uxpNdbWYrEwePBgpk6dSnh4OK+//jqTJk0if/78Rp1r167RpUsXVqxYgZ2dHY0aNeLrr7/GbDYbdQ4dOkTnzp3ZvXs3Xl5edO3alb59+1rFsnDhQj755BNCQ0ONxflq166drPPQtPciIiIiz9AQj9SOIM3w98uZ2iGkGc/jtPepnpC9KJSQiYiIiDxDSsgMSsj+9TwmZKk6ZFFERESeneDgYBwdHTGbzcZr+3brGcl++uknSpQogaurK9myZWPKlClG2d69e3n99ddxd3fnlVdeYc6cOUZZdHQ0VapUIXPmzLi7u1OwYEGmTp1qlO/YsYPAwEC8vLzImDEjgYGBHDt27KGxhoaGYjKZrGJ96623rOqEh4fTrl07vLy8cHd3p0yZMjZNNS0ikhYoIRMREXmJdOrUiaioKON1/+RVa9asoVOnTowbN47IyEiOHj1KlSpVgHvJT+3atWnRogXXr1/nxx9/pGvXrvz222/AvTVAJ0yYwPnz54mMjGTJkiUMHDjQmPXu+vXrtG7dmtOnT3Px4kXKli1LzZo1iYuLe2S8f/31lxHrihUrjO3x8fHUrVsXBwcHfv/9d8LDw5k2bVqamWFNRCS5lJCJiIgIAAMHDmTQoEFUqVIFe3t7MmTIQMGCBQHYtm0bTk5OdOzYEXt7e8qVK8fbb7/N9OnTAbC3t8ff35906e6tqGMymTCZTJw+fRqAWrVq0aRJEzw9PXF0dKRPnz78+eefnDt37oliDQkJISwsjAkTJpAxY0bs7OwoWbKkEjIRee4oIRMREXmJzJkzh4wZM1KkSBHGjBlDfHw8ADdv3mTv3r38/fff5M+fHx8fH9555x0uXLgA3OuRevCx8/j4eA4dOmS1rW7dujg7O1O4cGGyZMlCw4YNk4xj8+bNeHp6kjPno599KVq0KD4+PtSrV48TJ05Y7Z83b15atmxJpkyZKFKkCLNnz7b5eoiIpDYlZCIiIi+Jbt26cfLkSa5cucKMGTMYP34848ePB+4NKbRYLCxbtox169Zx+vRpnJycaNGiBXBvvc6bN28yceJEYmJi2Lp1K0uXLiUyMtLqGCtXruTmzZts2rSJRo0a4eLikiiOsLAw3n//fcaMGWP0qD3Iy8uLnTt3cvbsWU6cOEG+fPl48803jeNdu3aNjRs3UqFCBS5cuMDUqVPp0qULW7ZsSclLJiLy1CkhExEReUmUKlUKb29v7O3tKV++PP369WP+/PkAxlIx3bp1I1euXJjNZoYOHcrGjRu5efMmmTJlYsWKFfzwww/4+PjQr18/WrduTaZMmRIdx97ensqVK3Pp0iW++OILq7K//vqLatWq0aVLF9q0afPQWM1mM2XLlsXBwQFPT0++/PJLYmJi2LZtm1GeI0cOunTpgqOjIxUqVKBBgwasXLkypS6XiMgzoYRMRETkJWVn9+/XgEcNH0wYqlihQgW2bdvG1atX+fXXX7l48SKVK1d+aPsxMTGcOnXKeP/XX39RtWpVWrRowYABA2yKNeGZtATFixe3aX8RkbRKCZmIiMhLYsGCBURGRmKxWNizZw8jR46kUaNGRnmHDh2YMGECf//9N7dv32bYsGFUq1bN6D3bv38/0dHR3L59m2nTprFp0yZ69OgBwIEDB1i3bh23b98mNjaWVatWMXfuXAIDAwE4f/48VatW5b333mPw4MGPjXXnzp0cP36cuLg4oqKi6Nu3LyaTyZgVsmHDhty5c4cpU6YQFxfHzp07Wb58OfXq1UvhqyYi8nQpIRMREXlJTJw4kZw5c+Lm5kbz5s3p1KkTvXr1Msr79etHtWrVKF68OL6+vty6dYvvvvvOKP/666/JkiUL3t7eLFy4kF9++YVs2bIBEBsby4ABA8iSJQuZMmViwIABjB07lmbNmgEwbdo0Tp8+zbhx46zWFkuYFj8sLAyz2UxYWBgAZ86coW7duri7u+Pn58fRo0dZu3YtHh73FgP29PRk1apVzJgxA3d3d1q1asU333zD66+//kyupYhISjFZHpwySZ6ILatxi4iIiMh/NMQjtSNIM/z9Hj1b6cvkcNDh1A4BsC03UA+ZiIiIiIhIKlFCJiIiIiIikkqSXvxDREREnmv+s/1TO4Q0I60MYRIRSYp6yERERERERFKJEjIREREREZFUooRMREREREQklfznhCwyMpJly5Zx/PjxlIhHRERERETkpWFzQvbuu+8yceJEAG7fvk2ZMmV49913KVasGIsXL07xAEVERERERF5UNidkW7ZsoWLFigAsXboUi8VCeHg4X3/9NcOHD0/xAEVERERERF5UNidkERERZMyYEYA1a9bQqFEj0qdPT506dTh16lSKBygiIiIiIvKisjkh8/X1Zfv27dy8eZM1a9ZQo0YNAK5fv46zs3OKBygiIiIiIvKisnlh6B49etC8eXPMZjO5cuWiSpUqwL2hjP7+WoRSREREREQkuWxOyDp16kTZsmX5888/efPNN7Gzu9fJ9sorr+gZMhERERERERskOyGrWLEi9evXp379+pQpU4YyZcpYldepUyfFgxMREREREXmRJfsZsvbt27N9+3ZKlSpFoUKF6Nu3L1u3bsVisTzN+ERE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kowNGzaY+yjPbO/atcu47bbbDC8vL+O6664zpkyZcpWPFJWZzTAMw5pzcwAAAABQvXENGQAAAABYhEAGAAAAABYhkAEAAACARQhkAAAAAGARAhkAAAAAWIRABgAAAAAWIZABAAAAgEUIZAAAAABgEQIZAADVxMSJExUeHm51G6bDhw/LZrMpLS3N6lYAwDIEMgCo5h566CHZbDYNHz681FpMTIxsNpseeuihK95Hfn6+pk6dqjZt2sjX11d169ZVp06dNG/ePBUUFFzx16/MGjdurBkzZlx0fePGjbLZbJf82bhx41XrFwBQfgQyAIAaNmyoxYsX69y5c+a23NxcLVq0SI0aNbrir5+fn6/IyEhNmTJFDz/8sLZs2aLt27crJiZGr7/+uvbu3XvFe/gjygqM+fn5V+31b731Vv3888/mz/3336+77rrLadutt976u/Z9NY8DAKojAhkAQO3atVPDhg318ccfm9s+/vhjNWrUSG3btnWqTUhI0G233aaAgADVqVNHf/3rX3Xw4EFz/V//+pf8/Px04MABc9sjjzyi5s2b6+zZs2W+/owZM7R582YlJSUpJiZG4eHhuv766zVgwABt27ZNTZs2lSTl5eVp5MiRCgwMlLe3t2677Tbt2LHD3E/xmaKkpCS1b99evr6+uvXWW5Wenu70eitWrNDNN98sb29v1a1bV3369DHXbDabli9f7lQfEBCg+fPnSyr5mN2SJUt0xx13yNvbWwsXLtRDDz2k3r176/nnn1f9+vXVrFkzSdL333+v+++/XwEBAapdu7Z69eqlw4cPm/suft4rr7yia6+9VnXq1FFMTIwZ8jp37qwjR45o9OjR5tmu3/L09FRwcLD54+PjIy8vL6dtnp6eZv17772nxo0by9/fXw888IBOnz5trnXu3FmxsbEaNWqU6tatq8jISEnSnj171KNHD/n5+SkoKEiDBg3SL7/8Yj7vcr8XkrR9+3a1bdtW3t7eat++vVJTU53WT548qYEDB6pevXry8fFR06ZNNW/evFLHCwBVCYEMACBJGjJkiNP/+J07d64GDx5cqi4nJ0dxcXHauXOnkpKS5Obmpj59+qioqEiS9OCDD+ruu+/WwIEDdf78ea1atUrvvPOOFi5cKF9f3zJfe+HCherWrVup8CdJHh4eqlGjhiRp7Nix+r//+z8tWLBAX331lZo0aaLIyEidOHHC6TlPP/20pk2bpp07d+qaa67RkCFDzLVVq1apT58+uvvuu5WamqqkpCTdcsstLr9fTz31lB577DHt37/fDC1JSUlKT09XYmKiVq5cqYKCAkVGRqpmzZr6/PPP9eWXX8rPz0933XWX05mnDRs26ODBg9qwYYMWLFig+fPnmwHw448/VoMGDTR58mTzbNcfcfDgQS1fvlwrV67UypUrtWnTJk2ZMsWpZsGCBfL09NSXX36pOXPmKCsrS126dFHbtm21c+dOJSQk6OjRo7r//vvN51zu9+LMmTP661//qrCwMKWkpGjixIl64oknnF732Wef1b59+7RmzRrt379fs2fPVt26df/Q8QJApWcAAKq16Ohoo1evXsaxY8cMLy8v4/Dhw8bhw4cNb29v4/jx40avXr2M6Ojoiz7/+PHjhiRj9+7d5rYTJ04YDRo0MEaMGGEEBQUZzz///CV78PHxMUaOHHnJmjNnzhgeHh7GwoULzW35+flG/fr1jalTpxqGYRgbNmwwJBmfffaZWbNq1SpDknHu3DnDMAzD4XAYAwcOvOjrSDKWLVvmtM3f39+YN2+eYRiGcejQIUOSMWPGDKea6OhoIygoyMjLyzO3vffee0azZs2MoqIic1teXp7h4+NjrF271nxeSEiIcf78ebPmvvvuM/r162c+DgkJMV599dVLvT2leunVq1ep7RMmTDB8fX2N7Oxsc9uYMWOMDh06mI/vuOMOo23btk7Pe+6554zu3bs7bfv+++8NSUZ6enqZPfz29+LNN9806tSpY/49GIZhzJ4925BkpKamGoZhGD179jQGDx5c7uMEgKqAM2QAAElSvXr1FBUVpfnz52vevHmKiooq8+zEgQMH1L9/f11//fWy2+1q3LixJCkjI8OsqVWrlt59913Nnj1bN9xwg5566qlLvrZhGJft7+DBgyooKFCnTp3MbR4eHrrlllu0f/9+p9rWrVubf7722mslSceOHZMkpaWlqWvXrpd9vctp3759qW2tWrVy+mjgrl279O2336pmzZry8/OTn5+fateurdzcXKeP8910001yd3d36rm434rWuHFj1axZ85KvFRER4fR4165d2rBhg3kMfn5+at68uSSZx3G534v9+/erdevW8vb2NvfrcDicXmfEiBFavHixwsPDNXbsWG3ZsqViDhoAKrFrrG4AAFB5DBkyRLGxsZKk+Pj4Mmt69uypkJAQvf3226pfv76KiorUsmXLUjd/2Lx5s9zd3fXzzz8rJyfHKQT81o033qhvvvmmwo7Dw8PD/HPxNVfFH53z8fG55HNtNlupgFjWTTuKP0Z5qW1nzpxRRESEFi5cWKq2Xr16ZfZb3ENxvxWtPK9V1nH07NlTL730Uqn9FQfe8v5eXEqPHj105MgRrV69WomJieratatiYmL0yiuvlHsfAPBnwxkyAICp+Nqm4muffuvXX39Venq6nnnmGXXt2lUtWrTQyZMnS9Vt2bJFL730klasWCE/Pz8z5F3MgAED9Nlnn5W6yYP0nzCUk5OjG264wbyu6cK1HTt2KCwsrNzH2Lp1ayUlJV10vV69ek7XaR04cOCiNyO5nHbt2unAgQMKDAxUkyZNnH78/f3LvR9PT08VFhb+rh4qQrt27bR37141bty41HHUqFGjXL8XLVq00Ndff63c3Fxz29atW0u9Vr169RQdHa33339fM2bM0FtvvXXFjw8ArEQgAwCY3N3dtX//fu3bt8/pI3TFatWqpTp16uitt97St99+q/Xr1ysuLs6p5vTp0xo0aJBGjhypHj16aOHChVqyZIk++uiji77uqFGj1KlTJ3Xt2lXx8fHatWuXvvvuO3344Yfq2LGjDhw4oBo1amjEiBEaM2aMEhIStG/fPg0bNkxnz57V0KFDy32MEyZM0AcffKAJEyZo//792r17t9OZny5dumjWrFlKTU3Vzp07NXz48FJnlcpr4MCBqlu3rnr16qXPP/9chw4d0saNGzVy5Ej98MMP5d5P48aNtXnzZv34449Odza8WmJiYnTixAn1799fO3bs0MGDB7V27VoNHjxYhYWF5fq9GDBggGw2m4YNG6Z9+/Zp9erVpc58jR8/Xp988om+/fZb7d27VytXrlSLFi2u5qECwFVHIAMAOLHb7bLb7WWuubm5afHixUpJSVHLli01evRovfzyy041jz32mGrUqKEXXnhB0n+uq3rhhRf0//7f/9OPP/5Y5n69vLyUmJiosWPH6s0331THjh11880367XXXtPIkSPVsmVLSdKUKVPUt29fDRo0SO3atdO3336rtWvXqlatWuU+vs6dO2vp0qX69NNPFR4eri5dumj79u3m+rRp09SwYUPdfvvtGjBggJ544omL3h3ycnx9fbV582Y1atRI9957r1q0aKGhQ4cqNzf3ou9xWSZPnqzDhw/rhhtucPqo49VSv359ffnllyosLFT37t3VqlUrjRo1SgEBAXJzcyvX74Wfn59WrFih3bt3q23btnr66adLfQTS09NT48aNU+vWrfWXv/xF7u7uWrx48dU8VAC46mxGea6kBgAAAABUOM6QAQAAAIBFCGQAAAAAYBECGQAAAABYhEAGAAAAABYhkAEAAACARQhkAAAAAGARAhkAAAAAWIRABgAAAAAWIZABAAAAgEUIZAAAAABgEQIZAAAAAFjk/wNmYy8dEaUqSAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def total_token_throughput_bar_plot(results):\n",
    "    data_by_strategy = {}\n",
    "    for res in results:\n",
    "        bench = res['bench']\n",
    "        max_threads = bench['max_concurrent_threads']\n",
    "        throughput = res['result']['run_total_throughput']  # Using total token throughput\n",
    "        \n",
    "        # Get the load balancing strategy; use \"K8s Service\" if not defined.\n",
    "        strategy = res.get('spec', {}).get('loadBalancing', {}).get('strategy', 'K8s Service')\n",
    "        if strategy != \"K8s Service\":\n",
    "            strategy = f\"KubeAI {strategy}\"\n",
    "\n",
    "        if strategy not in data_by_strategy:\n",
    "            data_by_strategy[strategy] = {\"max_threads\": [], \"throughput\": []}\n",
    "        data_by_strategy[strategy][\"max_threads\"].append(max_threads)\n",
    "        data_by_strategy[strategy][\"throughput\"].append(throughput)\n",
    "\n",
    "    # Convert the grouped data into a mapping for easier lookup:\n",
    "    # strategy -> {max_concurrent_threads: throughput}\n",
    "    data_mapping = {}\n",
    "    for strategy, data in data_by_strategy.items():\n",
    "        data_mapping[strategy] = dict(zip(data[\"max_threads\"], data[\"throughput\"]))\n",
    "\n",
    "    # Get the sorted unique max_concurrent_threads values across all groups.\n",
    "    unique_x = sorted(set(\n",
    "        max_thread \n",
    "        for data in data_by_strategy.values() \n",
    "        for max_thread in data[\"max_threads\"]\n",
    "    ))\n",
    "\n",
    "    # Setup for a grouped bar chart.\n",
    "    num_strategies = len(data_mapping)\n",
    "    bar_width = 0.8 / num_strategies  # total width per group = 0.8\n",
    "    x_indices = np.arange(len(unique_x))\n",
    "\n",
    "    plt.figure(figsize=(10, 6))\n",
    "    for i, (strategy, mapping) in enumerate(data_mapping.items()):\n",
    "        # Retrieve throughput values for each unique max_concurrent_threads (default to 0 if not present)\n",
    "        y_values = [mapping.get(x, 0) for x in unique_x]\n",
    "        # Shift each strategy's bars for a grouped effect.\n",
    "        bars = plt.bar(x_indices + i * bar_width, y_values, width=bar_width, label=strategy)\n",
    "        # Annotate each bar with its height (i.e., the throughput value)\n",
    "        for bar in bars:\n",
    "            height = bar.get_height()\n",
    "            plt.text(bar.get_x() + bar.get_width() / 2, height,\n",
    "                     f'{height:.2f}', ha='center', va='bottom', fontsize=9)\n",
    "\n",
    "    plt.xlabel(\"Max Concurrent Threads\")\n",
    "    plt.ylabel(\"Total token throughput in token/s\")\n",
    "    plt.title(\"Total Token Throughput by Load Balancing Method\")\n",
    "    plt.xticks(x_indices + bar_width * (num_strategies - 1) / 2, unique_x)\n",
    "    plt.legend()\n",
    "    plt.grid(axis='y')\n",
    "    plt.savefig(\"throughput_8r.png\", dpi=300)\n",
    "    plt.show()\n",
    "\n",
    "# Filter out any invalid results (for example, those with 2400 concurrency issues) and reverse the list.\n",
    "filtered_data = list(filter(lambda item: item.get(\"bench\")['max_concurrent_threads'] != 2400, all_results))\n",
    "filtered_data.reverse()\n",
    "total_token_throughput_bar_plot(filtered_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Q5WQkKApU6aoW7du2rZtm8X9uFFiYqI+/PBDdenSRf369dOlS5e0YMEChYWFafv27QoJCbH6azFgwAD5+PhozJgxOnLkiGbOnKnIyEgtX77c7Pnu3bu3qlWrphEjRqhYsWLas2eP1q5dq65du+r555/XG2+8oeXLl5td45SamqrPP/9czz77rFxdXW/a7y1btshgMKh27dp3/RzeiTp16kiSfv755zzFsHjxYl26dEkvv/yykpOTNWvWLLVo0UJ79+5V6dKl1aFDB7388stasmRJjvaWLFmiZs2aqUyZMncV8/79+9W4cWN5eXnp1VdflZOTk95//301a9ZMGzduVIMGDSRJ//zzj1asWKGOHTsqODhYp06d0vvvv6+mTZvqwIEDCggIkCRdvXpVLVu2VFxcnAYOHKiAgAB98skn+uGHHyyKKyEhQWfPnpXRaNTp06f17rvv6vLlyzlmnWfNmqWnnnpK3bp1U2pqqpYtW6aOHTtq1apVatu27U3bz2t/suRlvK5fv15PPvmk/P39NWjQIPn5+en333/XqlWrNGjQoFv2d/Pmzfryyy/10ksvydPTU++8846effZZxcXFqUSJEpKuJcFt2rSRv7+/xo0bp4yMDL3xxhumpCav2rdvr/79++vLL79U7969JV2btapcubIefvjhHPWTkpLUtGlTHT9+XP/5z3/0wAMPaMuWLRoxYoROnjypmTNn3vbviXT7/x8kyWg06qmnntKPP/6oPn36KCQkROvWrdOwYcN0/Phxvf3226b2+vbtq//+97/q2rWrGjZsqB9++OGWrzlQqBgBFCqLFi0ySjLu2LHDVNazZ0+jJOMbb7xhVrd27drGOnXqmB6fOXPGKMk4ZsyYHO22bNnSWKNGDWNycrKpLDMz09iwYUNjxYoVcxz/0UcfNaanp+cp5h07dhglGRctWmQ0Go3G1NRUY6lSpYzVq1c3Xr161VRv1apVRknG0aNHm/WtaNGiRqPRaNy8ebPRy8vL2LZtW7M4+/TpY/T39zeePXvW7LidO3c2ent7G5OSkoxGo9H4448/GiUZq1SpYkxJSTHVmzVrllGSce/evbfsR27P/Y3S09PN2jYajcYLFy4YS5cubezdu7epzJqvRatWrYyZmZmm8iFDhhgdHR2NFy9eNBqNRuPFixeNnp6exgYNGpg931ntZgkNDTU2aNDA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6+GHHzaVZWRk6KefftLs2bOVkpKSY5UbFxeXXK/fcnJykpOT0x3FAQAAcCspGQZbh2A3nDKTbR2C3UhRyu0r3Sfs5XO4JXHYdEELZ2dn1alTRzExMaayzMxMxcTEKDQ09I7abNmypfbu3Wu6L0NsbKzq1q2rbt26KTY2luVDAQAAAOQLm58WGBUVpZ49e6pu3bqqX7++Zs6cqStXrigiIkKS1KNHD5UpU0aTJ0+WdG0RjAMHDph+P378uGJjY+Xh4aEKFSrI09NT1atXNztG0aJFVaJEiRzlAAAAAGAtNk+uOnXqpDNnzmj06NGKj49XSEiI1q5da1rkIi4uTg4O2RNsJ06cUO3atU2Pp02bpmnTpqlp06Y3vTcDAAAAAOQ3g9FoNNo6CHuTmJgob29vJSQksKAFAADIF0HDv7V1CHbjiGtXW4dgN2oEP2DrEOzG3p57bR2CJMtyA5vfRBgAAAAACgOSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACkisAAAAAsAKSKwAAAACwApIrAAAAALACu0iu5syZo6CgILm6uqpBgwbavn37Tevu379fzz77rIKCgmQwGDRz5swcdSZPnqx69erJ09NTpUqVUnh4uP7444987AEAAACA+53Nk6vly5crKipKY8aM0e7du1WrVi2FhYXp9OnTudZPSkpS+fLl9eabb8rPzy/XOhs3btTLL7+sX375RevXr1daWppat26tK1eu5GdXAAAAANzHDEaj0WjLABo0aKB69epp9uzZkqTMzEwFBgZqwIABGj58+C33DQoK0uDBgzV48OBb1jtz5oxKlSqljRs3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qVNHMTExprLMzEzFxMQoNDQ0131CQ0PN6kvS+vXrzepnJVaHDh3S999/rxIlSuRPBwAAAADg/9n8tMCoqCj17NlTdevWVf369TVz5kxduXJFERERkqQePXqoTJkymjx5siRp0KBBatq0qaZPn662bdtq2bJl2rlzp+bPv3aublpamjp06KDdu3dr1apVysjIMF2PVbx4cTk7O9umowAAAAAKNZsnV506ddKZM2c0evRoxcfHKyQkRGvXrjUtWhEXFycHh+wJtoYNG2rp0qUaNWqURo4cqYoVK2rFihWqXr26JOn48eNauXKlJCkkJMTsWD/++KOaNWt2T/oFAAAA4P5i8+RKkiIjIxUZGZnrtg0bNuQo69ixozp27Jhr/aCgIBmNLG0KAAAA4N6y+U2EAQAAAKAwILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAKyC5AgAAAAArILkCAAAAACsguQIAAAAAK7CL5GrOnDkKCgqSq6urGjRooO3bt9+y/meffabKlSvL1dVVNWrU0OrVq822G41GjR49Wv7+/nJzc1OrVq106NCh/OwCAAAAgPuczZOr5cuXKyoqSmPGjNHu3btVq1YthYWF6fTp07nW37Jli7p06aI+ffpoz549Cg8PV3h4uPbt22eqM2XKFL3zzjuaN2+etm3bpqJFiyosLEzJycn3qlsAAAAA7jM2T65mzJihfv36KSIiQlWrVtW8efPk7u6uhQsX5lp/1qxZatOmjYYNG6YqVapo/PjxevjhhzV79mxJ12atZs6cqVGjRunpp59WzZo1tXjxYp04cUIrVqy4hz0DAAAAcD8p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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def itl_bar_plot(results):\n",
    "    data_by_strategy = {}\n",
    "    for res in results:\n",
    "        bench = res['bench']\n",
    "        max_threads = bench['max_concurrent_threads']\n",
    "        itl_str = res['result']['itl']['mean']\n",
    "        itl_sec = parse_time(itl_str)\n",
    "\n",
    "        # Get the load balancing strategy; use \"K8s Service\" if not defined.\n",
    "        strategy = res.get('spec', {}).get('loadBalancing', {}).get('strategy', 'K8s Service')\n",
    "        if strategy != \"K8s Service\":\n",
    "            strategy = f\"KubeAI {strategy}\"\n",
    "\n",
    "        if strategy not in data_by_strategy:\n",
    "            data_by_strategy[strategy] = {\"max_threads\": [], \"itl\": []}\n",
    "        data_by_strategy[strategy][\"max_threads\"].append(max_threads)\n",
    "        data_by_strategy[strategy][\"itl\"].append(itl_sec)\n",
    "\n",
    "    # Convert the grouped data into a mapping for easier lookup:\n",
    "    # strategy -> {max_concurrent_threads: itl_sec}\n",
    "    data_mapping = {}\n",
    "    for strategy, data in data_by_strategy.items():\n",
    "        data_mapping[strategy] = dict(zip(data[\"max_threads\"], data[\"itl\"]))\n",
    "\n",
    "    # Get the sorted unique max_concurrent_threads values across all groups.\n",
    "    unique_x = sorted(set(\n",
    "        max_thread \n",
    "        for data in data_by_strategy.values() \n",
    "        for max_thread in data[\"max_threads\"]\n",
    "    ))\n",
    "\n",
    "    # Setup for a grouped bar chart.\n",
    "    num_strategies = len(data_mapping)\n",
    "    bar_width = 0.8 / num_strategies  # total width per group = 0.8\n",
    "    x_indices = np.arange(len(unique_x))\n",
    "\n",
    "    plt.figure(figsize=(10, 6))\n",
    "    for i, (strategy, mapping) in enumerate(data_mapping.items()):\n",
    "        # Retrieve ITL values for each unique max_concurrent_threads (default to 0 if not present)\n",
    "        y_values = [mapping.get(x, 0) for x in unique_x]\n",
    "        # Shift each strategy's bars for a grouped effect.\n",
    "        bars = plt.bar(x_indices + i * bar_width, y_values, width=bar_width, label=strategy)\n",
    "        # Annotate each bar with its height (i.e., the ITL value)\n",
    "        for bar in bars:\n",
    "            height = bar.get_height()\n",
    "            plt.text(bar.get_x() + bar.get_width() / 2, height,\n",
    "                     f'{height:.2f}', ha='center', va='bottom', fontsize=9)\n",
    "\n",
    "    plt.xlabel(\"Max Concurrent Threads\")\n",
    "    plt.ylabel(\"Inter-Token Latency (s)\")\n",
    "    plt.title(\"Inter-Token Latency (ITL) by Load Balancing Method\")\n",
    "    plt.xticks(x_indices + bar_width * (num_strategies - 1) / 2, unique_x)\n",
    "    plt.legend()\n",
    "    plt.grid(axis='y')\n",
    "    plt.savefig(\"itl_8r.png\", dpi=300)\n",
    "    plt.show()\n",
    "\n",
    "# Filter out any invalid results (for example, those with 2400 concurrency issues) and reverse the list.\n",
    "filtered_data = list(filter(lambda item: item.get(\"bench\")['max_concurrent_threads'] != 2400, all_results))\n",
    "filtered_data.reverse()\n",
    "itl_bar_plot(filtered_data)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
